package com.liuhouse.runner;

import com.liuhouse.mapper.ArticleMapper;
import com.liuhouse.pojo.Article;
import com.liuhouse.utils.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Component
//当项目启动的时候,就把博客中的浏览量(id和viewCount字段),存储到redis中,也叫做启动预处理 CommandLineRunner 是 spring 提供的接口
public class ViewCountRunner implements CommandLineRunner {

    //用于操作数据库的 article表  对象的注入
    @Autowired
    private ArticleMapper articleMapper;

    //操作redis 对象的自动注入
    @Resource
    private RedisCache redisCache;

    @Override
    public void run(String... args) throws Exception {
        //查询数据库中的博客信息,注意只需要查询id,viewCount字段的博客信息
        List<Article> articles = articleMapper.selectList(null);//null表示不需要查询条件,表示查询所有的文章信息
        //使用stream流的方式或者文章id和浏览量viewCount的键值对信息
        Map<String, Integer> viewCountMap = articles.stream()
                .collect(Collectors.toMap(new Function<Article, String>() {
                    @Override
                    public String apply(Article article) {
                        return article.getId().toString();
                    }
                }, new Function<Article, Integer>() {
                    @Override
                    public Integer apply(Article article) {
                        return article.getViewCount().intValue();
                    }
                }));
        //把查询到的id作为key,viewCount作为value,一起存入redis
        redisCache.setCacheMap("article:viewCount" , viewCountMap);
    }
}
